"""
路由处理工具
"""

from urllib.parse import quote


def concatenate_url(base_url: str, endpoint: str, param: dict) -> str:
    """
    构建 RESTFul API URL，根据给定的基础 URL、端点和参数字典。

    :param base_url: 基础 URL（例如 https://api.example.com）
    :param endpoint: API 端点（例如 'users/{email}/types/{type}'）
    :param param: 参数字典，用于替换 URL 中的变量部分（例如 {'email': 'user@example.com', 'type': 1}）
    :return: 完整的 RESTFul API URL 或者在参数无效时返回 ""
    """
    # 验证基础url和端点URL
    if not base_url or not endpoint:
        return ""

    # 去除末尾的斜杠
    base_url = base_url.rstrip('/')

    # 如果 endpoint 以斜杠开头，去掉它
    if endpoint.startswith('/'):
        endpoint = endpoint.lstrip('/')

    # 初始化 URL 部分列表
    url_parts = [base_url]

    try:
        # 分割 endpoint 并逐个处理每个部分
        for part in endpoint.split('/'):
            # 处理 URL 中的参数部分
            if '{' in part and '}' in part:
                key = part.strip('{}')
                value = param.get(key)

                if value:
                    # 使用 urllib.parse.quote 对 URL 特殊字符进行编码
                    encoded_value = quote(str(value))
                    url_parts.append(encoded_value)
                else:
                    # 如果值为空或None，添加空字符串来保持斜杠
                    url_parts.append('')
            else:
                # 处理非参数部分
                url_parts.append(part)

        # 构建最终 URL，确保每个部分之间有一个斜杠
        url = '/'.join(url_parts)

        return url

    except KeyError as e:
        # 针对缺少参数的情况，输出更明确的错误信息
        print(f"Missing parameter for URL construction: {e}")
        return ""

    except Exception as e:
        # 捕获其他所有异常
        print(f"Error building URL: {e}")
        return ""


def construct_url(base_url, endpoint) -> str:
    """
    拼接RESTFul API URL
    :param base_url: 基础路由
    :param endpoint: 端点路由
    :return 路由地址 RESTFul API URL
    """
    return '/'.join([base_url, endpoint])


if __name__ == '__main__':
    params = {"email": "17600111725", "type": 1}
    params1 = {"email": "17600111725"}
    params2 = {"type": 1}
    request_url = concatenate_url("https://test.arknovv.net/cycling", "usersystem/user/sendSecurityCode/{email}/{type}",
                                  params)
    print(request_url)
